'''
BeautifulSoup4简化复杂HTML文档转换成一个复杂的树形结构，每个节点都是Python对象，所有对象还可以归纳为4钟：

-Tag
-NavigableString
-BeautifulSoup
-Comment
'''
# coding = GBK
from bs4 import BeautifulSoup
import re  # 文档搜索正则表达式需要的库

file = open("./sougou.html", "rb")  # 二进制读入内存
html = file.read()
bs = BeautifulSoup(html, "html.parser")  # 对得到的html使用解析器用html.parser解析，bs为一个树形结构

# 1.Tag 标签及其内容：拿到他所找到的第一个该标签和内容
# print(bs.a)
# # print(bs.head)
# print(bs.title)

# 2.NavigableString  标签里面的内容（字符串）
# print(bs.title.string)
# print(type(bs.title.string))
# print(bs.a.attrs)  # 以字典方式得到该标签中所有东西
# print(bs.a.attrs["href"])  # 读取字典内容

# 3.BeautifulSoup  表示整个文档
#  # print(bs.decode("utf-8"))
# print(type(bs))  # <class 'bs4.BeautifulSoup'>
# print(bs.name)  # document

# 4.Comment  是一个特殊的NavigableString,输出的内容不包含注释符号
# print(bs.a.string)  # None  应该是 微信
# print(type(bs.a.string))  # <class 'NoneType'> 应该是 Comment

# ---------------------------------------------------------

# 文档的遍历
# print(bs.head.contents)  # 以列表方式存入每一个节点
# print()
# print(bs.head.contents[1])  # 可见 '\n'无法读取出来 为空白


# 文档的搜索
# （1）find_all()
# 字符号过滤：会查找与字符串完全匹配的内容
# list = bs.find_all("a")
# print(list)

# 正则表达式搜索：使用search（）方法来匹配内容
# list = bs.find_all(re.compile("a"))  # 只要包含'a'的标签都会被查找出来
# print(list)

# 方法：传入一个函数（方法），根据函数的要求来搜索
# def name_if_exits(tag):
#     return tag.has_attr("value")  # 搜索内有’value‘属性的标签
#
#
# list = bs.find_all(name_if_exits)
# for item in list:
#     print(item)

# （2）kwargs  参数  ： 查找有指定属性的标签
# list = bs.find_all(id="zhihu")  # 搜索有指定id
# list = bs.find_all(class_=True)  # 搜索有class的标签 注意class后面加上下划线_
# list = bs.find_all(href="http://weixin.sogou.com/")
# for item in list:
#     print(item)


# (3)text  参数  :查找有对应文本的标签
# list = bs.find_all(text="网页")
# list = bs.find_all(text=["网页","应用","图片"])
# list = bs.find_all(text=re.compile("\d"))  # 应用正则表达式来查找包含特定文本的内容（标签里的字符串） "\d"表示包含数字
# for item in list:
#     print(item)


#(4) limit 参数： 限定得出结果的数量
# list = bs.find_all("a",limit=3)
# for item in list:
#     print(item)

#（5）css选择器
# list = bs.select("head")  # 根据标签查找

# list = bs.select(".show-more")  # 根据 class名查找

# list = bs.select("#weixinch")  # 根据id查找

# list = bs.select("span[class='all']")  # 通过属性查找

# list = bs.select("head > title")  # 通过子标签查找

# list = bs.select("#index_more_baike ~ #index_more_zhishi")  # 通过兄弟标签查找，找到第一个id的标签，找到有第二个id且是刚找到的标签的的兄弟标签
# for item in list:
#     print(item.get_text())